Allow linking of mini-os with application-specific object code.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 15 May 2006 15:32:09 +0000 (16:32 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 15 May 2006 15:32:09 +0000 (16:32 +0100)
From: Jacob Gorm Hansen
Signed-off-by: Keir Fraser <keir@xensource.com>
extras/mini-os/Makefile
extras/mini-os/include/mm.h
extras/mini-os/kernel.c
extras/mini-os/mm.c

index 3a31e3a0d602bc59f8a596c2c236d8c4189463d5..56eb4ff1df9cf29f7d46255b0adf3e198f041ed5 100644 (file)
@@ -6,18 +6,23 @@ include $(CURDIR)/../../Config.mk
 override TARGET_ARCH     := $(XEN_TARGET_ARCH)
 
 # NB. '-Wcast-qual' is nasty, so I omitted it.
-CFLAGS := -fno-builtin -Wall -Werror -Iinclude/ -Wredundant-decls -Wno-format
+CFLAGS := -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format
 CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline
 
+override CPPFLAGS := -Iinclude $(CPPFLAGS)
+ASFLAGS = -D__ASSEMBLY__
+
+LDFLAGS := -N -T minios-$(TARGET_ARCH).lds
+
 ifeq ($(TARGET_ARCH),x86_32)
 CFLAGS += -m32 -march=i686
-LDFLAGS := -m elf_i386
+LDFLAGS += -m elf_i386
 endif
 
 ifeq ($(TARGET_ARCH),x86_64)
 CFLAGS += -m64 -mno-red-zone -fpic -fno-reorder-blocks
 CFLAGS += -fno-asynchronous-unwind-tables
-LDFLAGS := -m elf_x86_64
+LDFLAGS += -m elf_x86_64
 endif
 
 ifeq ($(debug),y)
@@ -28,12 +33,12 @@ endif
 
 TARGET := mini-os
 
-OBJS := $(TARGET_ARCH).o
-OBJS += $(patsubst %.c,%.o,$(wildcard *.c))
+HEAD := $(TARGET_ARCH).o
+OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
 OBJS += $(patsubst %.c,%.o,$(wildcard lib/*.c))
 OBJS += $(patsubst %.c,%.o,$(wildcard xenbus/*.c))
 OBJS += $(patsubst %.c,%.o,$(wildcard console/*.c))
-                                                                                  
+
 HDRS := $(wildcard include/*.h)
 HDRS += $(wildcard include/xen/*.h)
 
@@ -44,21 +49,25 @@ default: $(TARGET)
 links:
        [ -e include/xen ] || ln -sf ../../../xen/include/public include/xen
 
-$(TARGET): links $(OBJS)
-       $(LD) -N -T minios-$(TARGET_ARCH).lds $(OBJS) -o $@.elf
+libminios.a: $(OBJS) $(HEAD)
+       ar r libminios.a $(HEAD) $(OBJS)
+
+$(TARGET): links libminios.a $(HEAD)
+       $(LD) $(LDFLAGS) $(HEAD) -L. -lminios -o $@.elf
        gzip -f -9 -c $@.elf >$@.gz
 
 .PHONY: clean
 clean:
        find . -type f -name '*.o' | xargs rm -f
        rm -f *.o *~ core $(TARGET).elf $(TARGET).raw $(TARGET) $(TARGET).gz
+       rm -f libminios.a
        find . -type l | xargs rm -f
 
 %.o: %.c $(HDRS) Makefile
-       $(CC) $(CFLAGS) -c $< -o $@
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
 
 %.o: %.S $(HDRS) Makefile
-       $(CC) $(CFLAGS) -D__ASSEMBLY__ -c $< -o $@
+       $(CC) $(ASFLAGS) $(CPPFLAGS) -c $< -o $@
 
 define all_sources
      ( find . -follow -name SCCS -prune -o -name '*.[chS]' -print )
index a620bdd20913d308bb0d5042c2d720fb29c4af0f..2b33c454c715317422615dc1d34d1b193307c9c8 100644 (file)
 #define PAGE_ALIGN(addr)        (((addr)+PAGE_SIZE-1)&PAGE_MASK)
 
 extern unsigned long *phys_to_machine_mapping;
+extern char _text, _etext, _edata, _end;
 #define pfn_to_mfn(_pfn) (phys_to_machine_mapping[(_pfn)])
 static __inline__ unsigned long phys_to_machine(unsigned long phys)
 {
@@ -147,11 +148,7 @@ static __inline__ unsigned long machine_to_phys(unsigned long machine)
     return phys;
 }
 
-#if defined(__x86_64__)
-#define VIRT_START              0xFFFFFFFF80000000UL
-#elif defined(__i386__)
-#define VIRT_START              0xC0000000UL
-#endif
+#define VIRT_START                 ((unsigned long)&_text)
 
 #define to_phys(x)                 ((unsigned long)(x)-VIRT_START)
 #define to_virt(x)                 ((void *)((unsigned long)(x)+VIRT_START))
index 3ac572a0350b1ef62dea50e9ce97928353a61dae..49dbf6034bd541fdfdf2c069a14f155f18239909 100644 (file)
@@ -106,6 +106,12 @@ void setup_xen_features(void)
     }
 }
 
+/* This should be overridden by the application we are linked against. */
+__attribute__((weak)) int app_main(start_info_t *si)
+{
+    printk("Dummy main: start_info=%p\n", si);
+    return 0;
+}
 
 /*
  * INITIAL C ENTRY POINT.
@@ -165,12 +171,15 @@ void start_kernel(start_info_t *si)
     /* Init the console driver. */
     init_console();
  
-   /* Init scheduler. */
+    /* Init scheduler. */
     init_sched();
  
     /* Init XenBus from a separate thread */
     create_thread("init_xs", init_xs, NULL);
 
+    /* Call (possibly overridden) app_main() */
+    app_main(&start_info);
+
     /* Everything initialised, start idle thread */
     run_idle_thread();
 }
index a008e65a0a73b9d478e240c633d749e654f0f7c2..f1fc5448b4380a9aa6fa2179d2cf4747991a75da 100644 (file)
@@ -50,7 +50,6 @@
 
 unsigned long *phys_to_machine_mapping;
 extern char *stack;
-extern char _text, _etext, _edata, _end;
 extern void page_walk(unsigned long virt_addr);
 
 /*********************